package TarryDAOS;

import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import TarryDTOS.TarryPedidosDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Mauricio Alan
 */
public class TarryPedidosDAO {

    private PasarelaDatos db;
    private ResultSets res;

    public TarryPedidosDAO() {
        db = new PasarelaDatos();
        res = new ResultSets();
    }

    /**
     * ALAN GONZALEZ METODO PARA OBTENER TODOS LOS PEDIDOS GENERADOS POR UN
     * VENDEDOR LA VARIABLE
     *
     * @param vendedor
     * @return
     */
    public Vector pedidosPorVendedor(int idVendedor) {
        Vector pedidos = new Vector();
        String query = "SELECT * FROM pedidos WHERE pedidos.id_vendedor = " + idVendedor + " ORDER BY pedidos.fecha_creacion,pedidos.hora_creacion DESC ";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                TarryPedidosDTO p = new TarryPedidosDTO();
                p = res.tarryPedidosDTO(rst);
                pedidos.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return pedidos;
    }

    /**
     * ALAN GONZALEZ FILTRADO POR IDE DE USUARIO Y POR ID DE CLIENTE
     *
     * @param idVendedor
     * @param idCliente
     * @return
     */
    public Vector pedidosPorVendedorPorIdCliente(int idVendedor, int idCliente) {
        Vector pedidos = new Vector();
        String query = "SELECT * FROM pedidos WHERE pedidos.id_vendedor = "
                + idVendedor + " AND pedidos.id_cliente =" + idCliente + ";";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                TarryPedidosDTO p = new TarryPedidosDTO();
                p = res.tarryPedidosDTO(rst);
                pedidos.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return pedidos;
    }

    /**
     * ALAN GONZALEZ SELECCIONA LOS PEDIDOS POR USUARIO Y POR PEDIDO
     *
     * @param idVendedor
     * @param idPedido
     * @return
     */
    public Vector pedidosPorVendedorPorIdPedido(int idVendedor, int idPedido) {
        Vector pedidos = new Vector();
        String query = "SELECT * FROM pedidos WHERE pedidos.id_vendedor = "
                + idVendedor + " AND pedidos.id_pedido =" + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                TarryPedidosDTO p = new TarryPedidosDTO();
                p = res.tarryPedidosDTO(rst);
                pedidos.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return pedidos;
    }

    /**
     * ALAN GONZALEZ ACTUALIZA EL TOTAL DE UN PEDIDO CADA QUE SE AGREGA O SE
     * ELIMINA UN ITEM DEL MISMO
     *
     * @param idPedido
     */
    public void actualizarSubtotal(int idPedido, double total) {
        db.openDatabase();
        String query = "UPDATE pedidos SET ";
        query += " pedidos.total = " + total;
        query += " WHERE";
        query += " pedidos.id_pedido = " + idPedido + ";";
        db.execute(query);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ NUEVO PEDIDO
     *
     * @param idVendedor
     * @param idCliente
     * @param idPedido
     */
    public void nuevoPedido(int idVendedor, int idCliente, int idPedido, int tipoComprobante) {
        db.openDatabase();
        String query = "INSERT INTO pedidos SET";
        query += " pedidos.id_vendedor = " + idVendedor + ",";
        query += " pedidos.id_pedido =" + idPedido + ",";
        query += " pedidos.id_cliente =" + idCliente + ",";
        query += " pedidos.estado = 1,";
        query += " pedidos.fecha_creacion = NOW(),";
        query += " pedidos.hora_creacion = CURRENT_TIMESTAMP(),";
        query += " pedidos.tipo_comprobante =" + tipoComprobante;
        db.execute(query);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ - METODO AUXILIAR
     *
     * @param id
     * @return
     */
    public int idPedidoSegunIdRegistro(int id) {
        int idPedido = 0;
        db.openDatabase();
        String query = "SELECT pedidos.id_pedido FROM pedidos WHERE pedidos.id=" + id + " LIMIT 1;";
        ResultSet rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                idPedido = rst.getInt("id_pedido");
            } else {
                idPedido = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return idPedido;
    }

    /**
     * ALAN GONZALEZ METODO PARA BORRAR PEDIDOS
     *
     * @param idPedido
     */
    public void eliminarPedido(int id) {
        // SE ELIMINAN LOS ITEMS DEL PEDIDO BORRADO
        TarryItemsPedidoDAO itemsDAO = new TarryItemsPedidoDAO();
        itemsDAO.eliminarTodosItemsPedido(this.idPedidoSegunIdRegistro(id));
        // SE ELIMINAN LOS ITEMS DEL PEDIDO BORRADO
        db.openDatabase();
        String query = "DELETE  FROM pedidos WHERE pedidos.id=" + id;
        db.execute(query);
        db.closeDatabase();
    }

    /**
     *
     * @param idVendedor
     * @return
     */
    public Vector todoPedidoInformado() {
        Vector pedidos = new Vector();
        String query = "SELECT * FROM pedidos WHERE pedidos.bandera_informe > 0 ORDER BY pedidos.fecha_creacion,pedidos.hora_creacion DESC ";
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                TarryPedidosDTO p = new TarryPedidosDTO();
                p = res.tarryPedidosDTO(rst);
                pedidos.add(p);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return pedidos;
    }

    /**
     * ALAN GONZALEZ METODO QUE DEVUELVE UNA BANDERA PARA DETERMINAR SI ES
     * REMISION O FACTURA
     *
     * @param idPedido
     * @return
     */
    public int tipoComprobante(int idPedido) {
        int tipoComprobante = 0;
        db.openDatabase();
        String sql = " SELECT ";
        sql += " pedidos.tipo_comprobante ";
        sql += " FROM pedidos ";
        sql += " WHERE";
        sql += " pedidos.id_pedido = " + idPedido;
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                tipoComprobante = rst.getInt("tipo_comprobante");
            } else {
                tipoComprobante = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return tipoComprobante;
    }

    /**
     * ALAN GONZALEZ
     *
     * @return
     */
    public int idClientePorIdPedido(int idPedido) {
        int idCliente = 0;
        String sql = " SELECT";
        sql += " pedidos.id_cliente as cliente";
        sql += " FROM";
        sql += " pedidos";
        sql += " WHERE";
        sql += " pedidos.id_pedido  = " + idPedido;

        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                idCliente = rst.getInt("cliente");
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return idCliente;
    }

    /**
     * ALAN GONZALEZ | METODO PARA CAMBIAR EL ESTADO DE LA BANERA DE INFORME
     * ENVIA EMAIL A ALMACEN
     *
     * @param idPedido
     */
    public void cambioEstadoInformeVentasAlmacen(int idPedido) {
        db.openDatabase();
        String sql = " UPDATE";
        sql += " pedidos";
        sql += " SET";
        sql += " pedidos.bandera_informe = 1";
        sql += " WHERE";
        sql += " pedidos.id_pedido =" + idPedido;
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ | METDO QUE PERMITE EL FILTRADO DE LOS PEDIDOS QUE ESTEN
     * INFORMADOS
     *
     * @param idPedido
     * @return
     */
    public Vector pedidosInformadosFiltro(int idPedido) {
        Vector vPedidos = new Vector();
        String sql = "SELECT * FROM pedidos where pedidos.bandera_informe > 0 and pedidos.id_pedido =" + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                TarryPedidosDTO pedido = new TarryPedidosDTO();
                pedido = res.tarryPedidosDTO(rst);
                vPedidos.add(pedido);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidos;
    }

    /**
     * METODO QUE DEVUELVE EL NUMERO DE ITEMS CONTENIDO EN UN PEDIDO
     *     
* @param idPedido
     * @return
     */
    public int numeroItemsPedido(int idPedido) {
        int nItems = 0;
        String sql = "SELECT COUNT(*) AS TOTAL FROM items_pedido  WHERE items_pedido.id_pedido = " + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                nItems = rst.getInt("TOTAL");
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return nItems;
    }

    /**
     * ALAN GONZALEZ METODO QUE CAMBIA EL NUMERO DE ITEMS DENTRO DEL PEDIDO
     */
    public void actualizarNumeroItems(int idPedido) {
        String sql = "";
        sql += " UPDATE ";
        sql += " pedidos SET ";
        sql += " pedidos.bandera_productos = ( SELECT COUNT(*) ";
        sql += " FROM items_pedido WHERE items_pedido.id_pedido = " + idPedido + ") ";
        sql += " WHERE ";
        sql += " pedidos.bandera_informe = 0 AND ";
        sql += " pedidos.id_pedido =" + idPedido;
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * INFORMARA DEL ESTADO DEL PEDIDO 1: EN PROCESO 2: SURTIDO 3 ENVIADO 4
     * RECIBIDO 5 CANCELADO 6 ROBADO
     */
    public void actualizaBanderaEstadoPedido(int idPedido) {
        String sql = "UPDATE pedidos set pedidos.bandera_informe = 2 WHERE pedidos.id_pedido = " + idPedido;
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ SELECCIONA TODOS LOS PEDIDOS LISTOS PARA SU EMBARQUE Y
     * ENVIO
     *
     * @return
     */
    public Vector pedidosSurtidos() {
        Vector vPedidoSurtido = new Vector();
        String sql = "SELECT * FROM pedidos where pedidos.bandera_informe=2";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                TarryPedidosDTO pedido = new TarryPedidosDTO();
                pedido = res.tarryPedidosDTO(rst);
                vPedidoSurtido.add(pedido);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return vPedidoSurtido;
    }

    /**
     * INFORMARA DEL ESTADO DEL PEDIDO 1: EN PROCESO 2: SURTIDO 3 ENVIADO 4
     * RECIBIDO 5 CANCELADO 6 ROBADO
     */
    public void actualizaBanderaEstadoEnviado(int idPedido) {
        String sql = "UPDATE pedidos set pedidos.bandera_informe = 3 WHERE pedidos.id_pedido = " + idPedido;
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ NMETODO QUE DEVUELVE UN PEDIDO DETERMINADO POR SU ID
     *
     * @param idPedido
     * @return
     */
    public TarryPedidosDTO unPedidoPorId(int idPedido) {
        TarryPedidosDTO p = new TarryPedidosDTO();
        String sql = "SELECT * FROM pedidos WHERE pedidos.id_pedido = " + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                p = res.tarryPedidosDTO(rst);
            } else {
                p = null;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return p;
    }

    /**
     * ALAN GONZALEZ METODO QUE DEVUELVE UN VECTOR CON TODOS LOS PEDIDOS CON
     * ESTADO DE ENTREGADO
     *
     * @return
     */
    public Vector pedidosEnviados() {
        Vector vPedidos = new Vector();
        db.openDatabase();
        String sql = "SELECT * FROM pedidos where pedidos.bandera_informe = 3";
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                TarryPedidosDTO pedido = new TarryPedidosDTO();
                pedido = res.tarryPedidosDTO(rst);
                vPedidos.add(pedido);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidos;
    }

    /**
     * ALAN GONZALEZ ESTE METODO PERMITE ACTUALIZAR LA BANDERA DEL PEDIDO PARA
     * DARLE ESTADO DE ENTREGADO
     *
     * @param idpedido
     */
    public void actualizarBanderaEntregado(int idpedido) {
        db.openDatabase();
        String sql = "UPDATE pedidos SET pedidos.bandera_informe = 4 WHERE pedidos.id_pedido = " + idpedido;
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ | METEDODO QUE DEVUELVE UN VECTOR CON TODOS LOS REGISTROS
     * DE PEDIDOS CON ESTADOS ENTREGADOS
     *
     * @return
     */
    public Vector pedidosEntregados() {
        Vector vPedidos = new Vector();
        String sql = "SELECT * FROM pedidos WHERE pedidos.bandera_informe = 4";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                TarryPedidosDTO pedido = new TarryPedidosDTO();
                pedido = res.tarryPedidosDTO(rst);
                vPedidos.add(pedido);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidos;
    }

    /**
     * ALAN GONZALEZ | METODO QUE DEVUELVE EL MONTO TOTAL DE UN PEDIDO
     *
     * @param id
     * @return
     */
    public double montoTotalPedido(int idPedido) {
        double monto = 0;
        String sql = "SELECT pedidos.total FROM pedidos WHERE pedidos.id_pedido = " + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                monto = rst.getDouble("total");
            } else {
                monto = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryPedidosDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return monto;
    }
}
